package com.qyc.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.qyc.dto.AddOrUpdateAnimalDTO;
import com.qyc.enums.CodeMsgEnum;
import com.qyc.exception.SystemException;
import com.qyc.mapper.*;
import com.qyc.pojo.*;
import com.qyc.service.AnimalService;
import com.qyc.service.QrcodeService;
import com.qyc.utils.BeanCopyUtils;
import com.qyc.utils.QRcodeUtil;
import com.qyc.utils.ResponseResult;
import com.qyc.vo.AnimalFindByAnimalIdVO;
import com.qyc.vo.AnimalQueryPageVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Objects;

/**
* @author qinyc
* @description 针对表【manager_animal(动物信息表)】的数据库操作Service实现
* @createDate 2023-06-25 10:52:51
*/
@Service
public class AnimalServiceImpl extends ServiceImpl<AnimalMapper, Animal>
    implements AnimalService{

    //注入动物相关Mapper层对象
    @Autowired
    private AnimalMapper animalMapper;

    //注入批次相关Mapper层对象
    @Autowired
    private BatchMapper batchMapper;

    //注入栏舍相关Mapper层对象
    @Autowired
    private FenceHouseMapper fenceHouseMapper;

    //注入栏圈相关Mapper层对象
    @Autowired
    private HurdlesMapper hurdlesMapper;

    @Autowired
    private QrcodeMapper qrcodeMapper;

    @Value("${image.server}")
    private String server;

    /**
     * @Author qinyc
     * @Description  分页多条件查询动物基本信息以及对应批次信息、栏圈信息以及栏舍信息
     * @version: v1.0
     * @Date 11:04 2023/6/25
     **/
    @Override
    public ResponseResult queryPage(Integer pageNum, Integer pageSize, String aHealthy, String aGender) {
        //开启PageHelper分页插件
        PageHelper.startPage(pageNum,pageSize,true);
        //调用Mapper层代码
        List<AnimalQueryPageVO> animalQueryPageVOS = animalMapper.queryPage(aHealthy,aGender);
        //封装为PageInfo对象
        PageInfo pageInfo = new PageInfo(animalQueryPageVOS);
        //返回统一响应
        return ResponseResult.success(pageInfo);
    }

    /**
     * @Author qinyc
     * @Description  power by lining
     * @Author qinyc 
     * @Description  根据动物ID生成对应的二维码信息
     * @version: v1.0
     * @Date 12:11 2023/6/25
     **/
    @Override
    public ResponseResult qrCode(String animalId) {
        //生成二维码到指定位置(二维码存放位置需要去application.yml文件中进行修改)
        String qRcodeUrl = QRcodeUtil.createQRcode(animalId);
        //将生成的二维码存放在数据库中
        /*
         * 判断动物ID是否存在
         * 存在：修改
         * 不存在：新增
         */
        //创建条件选择器
        LambdaQueryWrapper<Qrcode> qrcodeLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //根据动物ID查询
        qrcodeLambdaQueryWrapper.eq(Qrcode::getQAnimalId,animalId);
        //根据动物Id查询二维码对象
        Qrcode qrcode = qrcodeMapper.selectOne(qrcodeLambdaQueryWrapper);
        if (Objects.isNull(qrcode)){
            //创建二维码对象
            qrcode = new Qrcode();
            //没有查询到对应二维码        新增
            qrcode.setQAnimalId(animalId).setQImageUrl(server+qRcodeUrl);
            //新增二维码
            qrcodeMapper.insert(qrcode);
        }else{
            //查到对应二维码       修改
            qrcode.setQImageUrl(server+qRcodeUrl);
            //修改二维码
            qrcodeMapper.updateById(qrcode);
        }
        //返回成功响应
        return ResponseResult.success();
    }

    /**
     * @Author qinyc
     * @Description  根据动物编号查询动物基本信息以及对应批次信息、栏圈信息以及栏舍信息
     * 这个接口使用Mybatis-plus进行实现【观察涉及多表查询使用Mybatis-plus的复杂性】
     * @version: v1.0
     * @Date 12:54 2023/6/25
     **/
    @Override
    public ResponseResult findByAnimalId(String animalId) {
        //根据动物Id查询动物信息
        Animal animal = animalMapper.selectById(animalId);
        /*
         * 根据动物中的批次ID查询批次信息
         */
        //根据动物对象中的批次ID查询批次信息
        Batch batch = batchMapper.selectById(animal.getaAnimalId());

        /*
         * 根据动物中的栏圈ID查询栏圈信息
         */
        //根据动物信息中的栏圈ID查询栏圈信息
        Hurdles hurdles = hurdlesMapper.selectById(animal.getaHurdlesId());

        /*
         * 根据栏圈中的栏舍ID查询栏舍信息
         */
        FenceHouse fenceHouse = fenceHouseMapper.selectById(hurdles.gethFenceId());

        /*
         * 信息封装
         */
        //bean拷贝将动物信息封装在VO对象
        AnimalFindByAnimalIdVO animalFindByAnimalIdVO = BeanCopyUtils.copyBean(animal, AnimalFindByAnimalIdVO.class);
        //封装批次信息到VO对象
        animalFindByAnimalIdVO.setManagerBatch(batch);
        //封装栏圈名称到VO对象
        animalFindByAnimalIdVO.setManagerHurdles(hurdles.gethName());
        //封装栏舍名称到VO对象
        animalFindByAnimalIdVO.setManagerFenceHouse(fenceHouse.getFhName());
        //返回统一响应
        return ResponseResult.success(animalFindByAnimalIdVO);
    }

    /**
     * @Author qinyc
     * @Description  新增或修改动物
     * @version: v1.0
     * @Date 20:17 2023/6/25
     **/
    @Override
    public ResponseResult saveOrUpdateAnimal(AddOrUpdateAnimalDTO addOrUpdateAnimalDTO) {
        //参数校验
        //参数校验完毕
        //bean拷贝
        Animal animal = BeanCopyUtils.copyBean(addOrUpdateAnimalDTO, Animal.class);
        /*
         * 判断数据传输独享DTO是否含有动物ID
         * 没有动物ID：新增操作
         * 有动物ID：修改操作
         */
        if (StringUtils.hasText(addOrUpdateAnimalDTO.getaAnimalId())){
            //有动物ID信息  修改操作
            animalMapper.updateById(animal);
            //返回成功响应数据
            return ResponseResult.success();
        }else{
            //不含有动物ID信息  新增操作
            animalMapper.insert(animal);
            //返回成功响应数据
            return ResponseResult.success();
        }
    }

    /**
     * @Author qinyc
     * @Description  根据ID删除动物
     * @version: v1.0
     * @Date 20:36 2023/6/25
     **/
    @Override
    public ResponseResult deleteById(String aAnimalId) {
        //参数校验
        //判断动物ID是否为空
        if (!StringUtils.hasText(aAnimalId)){
            throw new SystemException(CodeMsgEnum.ANIMAL_ID_IS_NOT_NULL);
        }
        //根据动物ID查询动物信息
        Animal animal = animalMapper.selectById(aAnimalId);
        //判断指定ID的动物是否存在
        if (Objects.isNull(animal)){
            throw new SystemException(CodeMsgEnum.ANIMAL_IS_NOT_EXIST);
        }
        animalMapper.deleteById(aAnimalId);
        return ResponseResult.success();
    }

    /**
     * @Author qinyc
     * @Description  批量删除动物
     * @version: v1.0
     * @Date 20:50 2023/6/25
     **/
    @Override
    public ResponseResult deleteByIdAll(List<String> animalIds) {
        //参数校验
        //参数校验通过
        animalMapper.deleteBatchIds(animalIds);
        return ResponseResult.success();
    }


}




